#include <cassert>
// 提供了日志项目使用的代码示例
// 1. 头文件的包含 -- 只需要包含一个头文件即可
#include "../Logs/Uselog.h"
#include <iostream>
#include <unistd.h>

using namespace LogModule;
void LogPrint()
{
    // 然后使用时，只需要获取到想要的日志器，就可以实现日志的各种打印操作了！
    Logger::ptr logger = GetLogger("test");
    // 3.1 自己创建构造者对象，设置对应的属性，也就是1和2操作，然后进行信息输出
    logger->Debug("%s - %d", "Debug测试", 111);
    logger->Info("%s - %d", "Info测试", 111);
    logger->Warn("%s - %d", "Warn测试", 111);
    logger->Error("%s - %d", "Error测试", 111);
    logger->Fatal("%s - %d", "Fatal测试", 111);
    // 3.2 不创建构造者对象，默认为：标准输出输出日志消息、同步输出
    DEBUG("%s - %d", "Debug测试", 111);
    INFO("%s - %d", "INFO测试", 111);
    WARN("%s - %d", "WARN测试", 111);
    ERROR("%s - %d", "ERROR测试", 111);
    FATAL("%s - %d", "FATAL测试", 111);

    // 4. 输入特定文件与滚动文件大数据测试
    for (int i = 0; i < 100000; i++)
    {
        logger->Fatal("%s - %d", "大数据测试", i);
    }
}

int main()
{
    // 1. 使用前，需要创建一个构建者对象，参数默认为：
    // 同步日志、限制等级为DEBUG、向标准输出打印、默认创建root日志器
    // 需要传入GlobalLoggerBuilder
    LoggerBuilder::ptr builder = std::make_shared<GlobalLoggerBuilder>();

    // 2. 对于建造者builder可以执行的操作：
    // 2.1 设置日志器名称
    builder->BuildLoggerName("test");
    // 2.2 设置同步/异步日志 -- 同步：SYNC   异步：ASYNC
    builder->BulidLoggerType(LoggerType::LOGGER_ASYNC);
    // 2.3 设置安全/不安全写入 -- 安全：ASYNC_SAFE   不安全：ASYNC_UNSAFE
    // 安全：如果缓冲区写满了，阻塞   不安全：缓冲区写慢了，扩容
    // 只有异步操作考虑这个，因为同步操作没有缓冲区A
    // builder->BuildSetAsyncUnsafe(); // 默认安全，调用不安全
    // 2.4 设置日志输出等级
    builder->BuildLoggerLevel(LogLevel::Level::ERROR);
    // 2.5 设置日志输出格式
    builder->BuildLoggerFormatter("[%d{%H:%M:%S}][%t][%p][%c][%f:%l] %m%n");
    // 2.6 传入日志落地方向 -- 标准输出、特定文件、滚动文件
    builder->BuildSink<StdOutLogSink>();
    builder->BuildSink<FileLogSink>("./log/log.txt");
    builder->BuildSink<RollBySizeLogSink>("./log/log-roll-by-size-", 1024 * 1024);

    // 3. 用户想要使用，有两种方法，但是前提是都需要先build出一个日志对象
    builder->build();
    LogPrint();
    sleep(8);
    return 0;
}